10.1 並行処理と並列処理
並列処理は並行処理でもある(並列処理は並行処理に包含される)
並行処理であれば必ず並列処理とは限らない
プログラムが実行されるときには、プロセスが作成されてCPUやメモリなどのリソースが割り当てられます。各プロセスの中では、1つ以上のスレッドにより処理が行われています。(Kindle の位置No.4369-4370)
逐次処理
シングルコア・シングルスレッド
例:3本の記事を1人で順番に書き上げていく
Pythonでは並行処理として実装しない限りは逐次処理となる
並行処理(Concurrent processing)
マルチスレッド
例:3本の記事を1人で少しずつ進めていく
記事1→2→3→1→2→3
並列処理(Parallel processing)
マルチコア、マルチプロセス
例:3人で1人1記事ずつ同時に執筆を進める
並行処理を導入する際、どの方法が適しているかはその処理がCPUバウンドな処理かI/Oバウンドな処理かに依存します。(Kindle の位置No.4387-4388)
CPUバウンド
CPUのリソースを使って計算を行う処理
複数のコアを同時に使って並列処理を行えるマルチプロセスが有効 (Kindle の位置No.4391)
GILがあるため、マルチスレッド、イベントループによる処理高速化は期待できない (Kindle の位置No.4392)
I/Oバウンド
通信による待ち時間が発生する処理
マルチプロセス、マルチスレッド、イベントループいずれも有効 (Kindle の位置No.4394-4395)
一般的に、実行時のオーバーヘッドは大きいものから順にマルチプロセス、マルチスレッド、イベントループとなります。(Kindle の位置No.4396-4397)
同期処理と非同期処理
関数やメソッドは同期処理
呼び出した先の処理が完了するまで次の処理に進めない
非同期処理では、呼び出した先の処理が実行中であっても、呼び出し元は次の処理に進められます (Kindle の位置No.4401-4402)
非同期処理は並行処理になっている(並行処理には並列処理も内包される)
呼び出し元に対して、処理の完了通知やコールバック関数
同内容のリソース